package core

import (
	"bytes"
	"fmt"
	"gvb-server/global"
	"os"
	"path"
	"time"

	"github.com/sirupsen/logrus"
)

// 颜色
const (
	red    = 31
	yellow = 33
	blue   = 36
	gray   = 37
)

type LoggerFormatter struct{}

func (l *LoggerFormatter) Format(entry *logrus.Entry) ([]byte, error) {

	var levelColor int

	switch entry.Level {
	case logrus.DebugLevel, logrus.TraceLevel:
		levelColor = gray
	case logrus.WarnLevel:
		levelColor = yellow
	case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:
		levelColor = red
	default:
		levelColor = blue
	}

	var b *bytes.Buffer
	if entry.Buffer != nil {
		b = entry.Buffer
	} else {
		b = &bytes.Buffer{}
	}

	// 自定义 时间格式
	timestemp := entry.Time.Format("2006-01-02 15:04:05")

	// 设置前缀
	log := global.Config.Logger

	if entry.HasCaller() {
		// 自定义路径
		funVal := entry.Caller.Function
		fileVal := fmt.Sprintf("%s:%d", path.Base(entry.Caller.File), entry.Caller.Line)
		// 自定义输出格式
		fmt.Fprintf(b, "%s[%s] \x1b[%dm[%s]\x1b[0m %s %s %s\n", log.Prefix, timestemp, levelColor, entry.Level, fileVal, funVal, entry.Message)
	} else {
		fmt.Fprintf(b, "%s[%s] \x1b[%dm[%s]\x1b[0m %s\n", log.Prefix, timestemp, levelColor, entry.Level, entry.Message)
	}
	return b.Bytes(), nil
}

func SetDir(logFileName string) string {
	logFilePath := global.Config.Logger.Director

	// 获取当前日期
	currentTime := time.Now()
	date := currentTime.Format("2006-01-02") // 格式化日期

	// 构建二级文件夹路径
	folderPath := path.Join(logFilePath, date)

	// 检查文件夹是否存在
	if _, err := os.Stat(folderPath); os.IsNotExist(err) {
		// 文件夹不存在，创建文件夹
		err := os.MkdirAll(folderPath, os.ModePerm)
		if err != nil {
			fmt.Println("创建文件夹失败：", err)
			return ""
		}
	}

	// 构建日志文件路径
	fileName := path.Join(folderPath, logFileName)

	// 检查文件是否存在
	if _, err := os.Stat(fileName); os.IsNotExist(err) {
		// 文件不存在，创建文件
		src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666) // 0666代表读写权限
		if err != nil {
			fmt.Println("打开文件失败：", err)
			return ""
		}

		defer src.Close()
	}
	return fileName
}

func InitLogger() *logrus.Logger {
	fileName := SetDir("app.log")
	// 创建并打开文件
	src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, os.ModeAppend)
	if err != nil {
		fmt.Println("打开文件失败：", err)
	}

	mLog := logrus.New() //新建一个卖例

	mLog.SetOutput(os.Stdout)                           //设置输出卖型
	mLog.SetReportCaller(global.Config.Logger.ShowLine) //开启这回函数名和行号
	mLog.SetFormatter(&LoggerFormatter{})               //设责自己定义的Formatter

	level, err := logrus.ParseLevel(global.Config.Logger.Level)
	if err != nil {
		level = logrus.InfoLevel
	}

	mLog.SetLevel(level) //没置最低的Level
	InitDefautlogger()   // 直接使用全局log的话 也是可以的 【写法： logrus.Infof("Infof")】

	// 设置输出
	mLog.Out = src
	return mLog
}

func InitDefautlogger() {
	// 全局Log
	logrus.SetOutput(os.Stdout)                           //设置输出类型
	logrus.SetReportCaller(global.Config.Logger.ShowLine) //开启返回函教名和行号
	logrus.SetFormatter(&LoggerFormatter{})               //没置自己定义的Formatter
	level, err := logrus.ParseLevel(global.Config.Logger.Level)
	if err != nil {
		level = logrus.InfoLevel
	}
	logrus.SetLevel(level) //设置最低的Level

}
